package net.linku.annotation.enums;

import lombok.Getter;

import java.util.Arrays;

/**
 * 变更来源枚举类，用于标识变更记录的来源系统或平台。
 * <p>
 * 该枚举类定义了不同的变更来源，包括系统标识符、中文名称和英文名称。
 * </p>
 *
 * @author SilenceTian
 * @date 2024/7/21
 */
@Getter
public enum ChangeSourceEnum {

    /**
     * 未知来源
     */
    UNKNOWN("unknown", "未知", "Unknown System"),

    /**
     * 协同平台
     */
    LINKU_ADMIN("linku_admin", "LinkU后台系统", "Linku Admin Platform"),

    /**
     * 采购系统
     */
    PMS("pms", "采购系统", "Procurement system");

    /**
     * 系统标识符，用于唯一标识变更来源。
     * <p>
     * 例如："supplier_with"、"pms" 等。
     * </p>
     */
    private final String code;

    /**
     * 中文名称，描述变更来源的中文名。
     * <p>
     * 例如："协同平台"、"采购系统" 等。
     * </p>
     */
    private final String cnName;

    /**
     * 英文名称，描述变更来源的英文名。
     * <p>
     * 例如："Supplier Collaboration Platform"、"Procurement system" 等。
     * </p>
     */
    private final String enName;

    /**
     * 构造函数，初始化变更来源枚举的属性。
     *
     * @param code   系统标识符
     * @param cnName 中文名称
     * @param enName 英文名称
     */
    ChangeSourceEnum(String code, String cnName, String enName) {
        this.code = code;
        this.cnName = cnName;
        this.enName = enName;
    }

    /**
     * 根据系统标识符匹配对应的变更来源枚举。
     * <p>
     * 如果无法匹配，返回 {@link #UNKNOWN}。
     * </p>
     *
     * @param code 系统标识符
     * @return 对应的变更来源枚举
     */
    public static ChangeSourceEnum matchCodeEnum(String code) {
        return Arrays.stream(ChangeSourceEnum.values())
                .filter(enumType -> enumType.code.equalsIgnoreCase(code))
                .findFirst()
                .orElse(UNKNOWN);
    }
}
